import java.util.concurrent.*;

/**
 * @author 3489309323@qq.com
 * @create 2020-09-14-20:07
 */
public class TreadPoolTest {

  //方式一: Executors
  public static ExecutorService service = Executors.newFixedThreadPool(10);

  /*public static void main(String[] args){
    System.out.println("main...start...");

    service.execute(new Runable01());

    System.out.println("main...end...");

//    main...start...
//    main...end...
//    当前线程id: 22
//    运行结果: 5
  }*/

  //方式二: new ThreadPoolExecutor()
  public static void main(String[] args) {
    System.out.println("main...start...");

    /**
     * 七大参数
     * ① corePoolSize: 核心线程数。 线程池一创建好就准备就绪的线程数量。 一直存在,不会超时,除非设置了 allowCoreThreadTimeOut
     * ② maximumPoolSize: 最大允许的线程数,用以控制资源
     * ③ keepAliveTime: 存在非核心的空闲线程时,当等待 [keepAliveTime] 后还没有接到新任务,就会释放这些空闲的非核心线程;
     * ④ unit: keepAliveTime的时间单位
     * ⑤ workQueue: BlockingQueue<Runnable> workQueue 阻塞队列。 如果任务很多,就会将目前多的任务放在队列里面,只要有线程空闲,就会去队列里面取出新的任务继续执行
     * ⑥ threadFactory: 线程的创建工厂
     * ⑦ handler: RejectedExecutionHandler handler. 如果阻塞队列都满了 该怎么做
     *
     * 工作顺序:
     * 1)、线程池创建,装备好core数量的核心线程,准备接受任务
     * 2)、新的任务进来,用core准备好的空线程执行
     *    (1) core满了,就将再进来的任务放入阻塞队列中。 空闲的core就会自己去阻塞队列获取任务执行。
     *    (2) 阻塞队列满了,就直接开新线程,最大只能开到max指定的数量
     *        + new LinkedBlockingQueue<>() 时 默认是Integer的最大值
     *    (3) 如果线程数开到了max的数量,还有新任务进来,就会使用reject(RejectedExecutionHandler)指定的拒绝策略进行处理
     *    (4) max都执行好了。 空闲的非核心(core)线程会在keepAliveTime指定的时间后自动销毁。 最终保持到core大小。
     *
     */
    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,200,10, TimeUnit.SECONDS,new LinkedBlockingQueue<>(100000/*←一般根据鸭梨测试得到系统峰值后得到的一个数量*/),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy()); //其实和第一种方式一样 都是得到一个实现了 ExecutorService 接口的东东

    System.out.println("main...end...");
  }

  public static class Runable01 implements Runnable {
    @Override
    public void run(){
      System.out.println("当前线程id: " + Thread.currentThread().getId());
      int i = 10 / 2;
      System.out.println("运行结果: " + i);
    }
  }

}

/*
一个线程池 core:7 max:20 queue:50,100并发进来怎么分配

7个会立即得到执行, 50个会进入队列, 再新开13个线程, 剩下的30个就使用拒绝策略
如果不想抛弃 还要执行, 采用CallerRunsPolicy策略
* */
